package com.atguigu.lease.common.exception;

import com.atguigu.lease.common.result.Result;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/*  AOP编程思想
        1.切入点: 被增强的方法,这里是所有Handler,将会使用切入点表达式
        2.增强(通知): 五种类型通知
        3.切面: 把通知应用到切入点过程,这里当前类是切面,比如对某handler增加一个异常处理功能
        4.在切面类中写切入点和增强
*/
/*  @ControllerAdvice:
        Advice:可以翻译为通知/增强,为所有Controller增强
        1.IOC 会将当前类交给Spring管理
        2.AOP 不改变/很少改变源码,就能增强功能,这里是将异常信息转为Result对象响应
        3.注解底层是切面类方式实现,不需要手动创建原始AOP切面类,Spring已经创建好了,只需要加上这个注解即可
*/
/*  本功能AOP分析
        1.切入点: 出现异常的方法
        2.增强: 异常处理
        3.切面类: @ControllerAdvice注解写好了
        4.捕获异常: 使用Spring组件异常处理器,使用@ExceptionHandler注解完成,
                是Spring对异常处理器封装的一个注解
*/
@ControllerAdvice
@ResponseBody//将响应结果转成JSON格式
//@RestControllerAdvice//可以将他们合并成这个注解
public class GlobalExceptionHandler {
    //需要指定捕获哪个异常
    @ExceptionHandler(value = Exception.class)
    public Result error(Exception e) {
        e.printStackTrace();
        return Result.fail(e.getMessage());
    }


    @ExceptionHandler(value = LeaseException.class)
    public Result leaseError(LeaseException e) {
        e.printStackTrace();
        return Result.fail(e.getCode(),e.getMessage());
    }

}
